#pragma once
//MxProductID - unique identifer for applications and components released as stand-alone products
// ==============================================================================================
// Instructions for adding a new product
//  1. Create a suitable company and product name -  i.e. MyCompany, MyProduct 
//	2. Generate a GUID (Visual Studio - Tools | Create GUID, select 3. static const struct GUID={...}
//	3. Create GUID PRODID_MyProduct and paste GUID into it - see below
//  4. Register Product GUID and details - MxPlugin.com/RegisterProdID (optional, not yet supported)
//  5. Applications (Non-MxPlugin): 
//		a. Create a class to define its ProdID, SID, Name, Description and support site - see class ProdIdMxPluginManagerGUI for example 
//      b. Use setup program or run app to create Windows Registry Entries (alternatively use flat file instead) - see InstallNotes.txt
//	6. MxPlugins : (done by install program or manually) - see InstallNotes.txt
//	7. Create resource for your product's Visual Studio Project - version, VS_VERSION_INFO 
//		a. for applications
//			i.   set Company name = Maximodex - it may be used for registry so keep small and simple - i.e. HKEY_CURRENT_USER\Software\Maximodex\
//			ii.  set internal name = {...}  - i.e. the GUID created in step 2 and same as class defined ProdID (step 5a)
//			iii. set Product name -  this is same as class defined Name (step 5a) - it may be used for Windows Registry, so make it unique in context of HKEY_*\Software\Maximodex\
//			iv.  set description - this is same as class defined Description (step 5a)
//		    vi.  set original filename - target filename - i.e. MxPluginMngr.exe
//			v.   set file version - see notes below
//      b. for MxPlugins - see IMxPluginLibDetails.h
//
//Note: combination of MxProductID and ErrorCode is unique for all Maximodex products:
//		.EXE (and their dependent loadtime linked DLLs) - Some form of application
//		.DLL (and their dependent loadtime linked DLLs) - Some form of library, typically MxPlugin
//Note: Increment values in VS_VERSION_INFO (major.minor.status.build) when changing major, minor or status
//		major = significant change in functionality, poss not compatible with previous major version number - i.e. user needs to change how he uses the product in some way
//		minor = small change in functionality, backwards compatible with previous version with same major version number
//		status = 0 - alpha code, 1 - beta code, 30 - release candidate zero, 31 - release candidate 1, etc
//		build = TFS change set (when a product is released externally create a TFS label with its version number)
//Note: SocketIDs (SID) serve only to help classify Plugins. For example, you might want to list all the Plugins on your PC that were developed for ImageCurator (SID_ImageCurator).
//		There is no MxPlugin architectural restriction on applications loading different types of Plugin - i.e. an App whose SID=SID_ImageCurator may also load MxPlugin developer for SID_Universal, or SID_URA, etc
//--------------------------------------------------------------------------------------------------

#include "IMxPluginBase.h"

#define PRODID_DefaultPluginRootFolder  L"C:\\Program Files (x86)\\Maximodex\\Common\\Bin\\"

static const GUID PRODID_Invalid =	GUID_Invalid;
static const GUID SID_Invalid =	GUID_Invalid;
//============================================================================================================================================================
					//Socket Ids - MxPlugins are developed to support a particular Application socket - a GUID (SID) this may be unique to a particular app, or shared by many apps (normal case) i.e. SID_Universal - see note above
//============================================================================================================================================================
static const GUID SID_Universal =			{ 0x2742858, 0x2cc8, 0x4c92, { 0xbe, 0x69, 0x5c, 0xc7, 0xba, 0x38, 0x7a, 0x7b } };  // {02742858-2CC8-4C92-BE69-5CC7BA387A7B}
static const GUID SID_ImageCurator =		{ 0x65bc4065, 0xb258, 0x4d14, { 0x9f, 0x83, 0xd4, 0x3d, 0x57, 0x37, 0x57, 0xe1 } };	// {65BC4065-B258-4D14-9F83-D43D573757E1}

//============================================================================================================================================================
					//general libs - load at loadtime
//============================================================================================================================================================
static const GUID PRODID_MxUtils =			{ 0x2a3bbf1e, 0xbe54, 0x4573, { 0x94, 0x7, 0x82, 0x8b, 0x6f, 0x7e, 0x7f, 0xdd } };	// Error range 1000-1199 {2A3BBF1E-BE54-4573-9407-828B6F7E7FDD}
static const GUID PRODID_MxPluginManager =	{ 0x7595969a, 0x38fa, 0x4fb6, { 0xa5, 0x60, 0x88, 0x3e, 0xc, 0x41, 0x72, 0x8a } };	// Error range 1300-1499 {7595969A-38FA-4FB6-A560-883E0C41728A}	depends: PRODID_MxUtils, (testing only) PRODID_PluginStdLib

//============================================================================================================================================================
					//MxPlugin libs - load at runtime
//============================================================================================================================================================
static const GUID PRODID_PluginStdLib =		{ 0x8cb84f11, 0x8199, 0x4508, { 0xa0, 0x81, 0xfd, 0xad, 0xb7, 0x1, 0x5a, 0xbd } };	// Error range 1200-1249 {8CB84F11-8199-4508-A081-FDADB7015ABD}	depends: PRODID_MxUtils
static const GUID PRODID_PluginXml =		{ 0x9e8e6865, 0xd31e, 0x40a2, { 0xb9, 0x13, 0x59, 0xbe, 0xbc, 0x11, 0xbc, 0x41 } };	// Error range 6000-6299 {9E8E6865-D31E-40A2-B913-59BEBC11BC41}	depends: PRODID_MxUtils, 
static const GUID PRODID_PluginICPsample =	{ 0xf3e44d51, 0x100b, 0x4240, { 0x9e, 0xca, 0x5d, 0xaa, 0x26, 0xd5, 0xb7, 0xb5 } };	// Error range 1800-1849 {F3E44D51-100B-4240-9ECA-5DAA26D5B7B5}	depends: PRODID_MxUtils, 

//============================================================================================================================================================
					//Applications - list in order of Base Code #
//============================================================================================================================================================

static const GUID PRODID_UnitTestApp = { 0xab082a4c, 0xc611, 0x413b, { 0x8b, 0x12, 0xd2, 0x1f, 0xa8, 0x33, 0x7, 0xeb } };	//  {AB082A4C-C611-413B-8B12-D21FA83307EB}
class ProdIdUnitTestApp		//use only for unit testing
{
public:
	static const   GUID ProdID() { return PRODID_UnitTestApp; }							
	static char * const Name() { return "UnitTestApp"; }								
	static char * const Description() { return "UnitTest App - use only for unit testing"; }									  
	static char * const SupportSite() { return "http://mxplugin.codeplex.com/"; }	
    static char * const LicenceWebPage() { return "http://mxplug.codeplex.com/license"; }	
	static const   GUID SID() { return SID_Universal; }		
	static char * const Owner() { return "MxDevTest"; }	
};

static const GUID PRODID_PluginStdLibApp    = { 0xa471a111, 0x6c72, 0x4f40, { 0x89, 0xe7, 0x42, 0x1a, 0x60, 0x4b, 0xcd, 0x8b } };	// Error range 1250-1299 {A471A111-6C72-4F40-89E7-421A604BCD8B} depends: PRODID_MxUtils
class ProdIdPluginStdLibApp
{
public:
	static const   GUID ProdID() { return PRODID_PluginStdLibApp; }											//Same as MxProductID::ConvertToGUID(VS_VERSION_INFO::InternalName) 
	static char * const Name() { return "PluginStdLibApp"; }												//same as VS_VERSION_INFO::ProductName - 
	static char * const Description() { return "PluginStdLibApp simple exercises PluginStdDetailsLib"; }	//same as VS_VERSION_INFO::FileDescription  
	static char * const SupportSite() { return "http://mxplugin.codeplex.com/"; }	
    static char * const LicenceWebPage() { return "http://mxplugin.codeplex.com/license"; }	
	static const   GUID SID() { return SID_Universal; }														//SocketID - see Socket Id section above 
	static char * const Owner() { return "Maximodex"; }														//used for creating registry key
};

static const GUID PRODID_MxPluginManagerApp = { 0x5895751d, 0xb06b, 0x4c33, { 0x85, 0xd7, 0xa5, 0xb0, 0xf2, 0xc5, 0xb6, 0x2c } };   // Error range 1500-1599 {5895751D-B06B-4C33-85D7-A5B0F2C5B62C} depends: PRODID_MxUtils
class ProdIdMxPluginManagerApp
{
public:
	static const   GUID ProdID() { return PRODID_MxPluginManagerApp; }					//same as MxProductID::ConvertToGUID(VS_VERSION_INFO::InternalName) 
	static char * const Name() { return "MxPluginManagerApp"; }							//same as VS_VERSION_INFO::ProductName - 
	static char * const Description() { return "Support for MxPlugin components"; }		//same as VS_VERSION_INFO::FileDescription  
	static char * const SupportSite() { return "http://mxplugin.codeplex.com/"; }	
    static char * const LicenceWebPage() { return "http://mxplugin.codeplex.com/license"; }		
	static const   GUID SID() { return SID_Universal; }									//SocketID - see Socket Id section above 
	static char * const Owner() { return "Maximodex"; }									//used for creating registry key
};

static const GUID PRODID_MxPluginManagerGUI = { 0x949dce6f, 0xfd95, 0x4d61, { 0x87, 0xb1, 0x3d, 0x29, 0x25, 0x50, 0x13, 0xe9 } };	// Error range 1600-1799 {949DCE6F-FD95-4D61-87B1-3D29255013E9} depends: PRODID_MxUtils
class ProdIdMxPluginManagerGUI
{
public:
	static const   GUID ProdID() { return PRODID_MxPluginManagerGUI; }					//same as MxProductID::ConvertToGUID(VS_VERSION_INFO::InternalName) 
	static char * const Name() { return "MxPluginManagerGUI"; }							//same as VS_VERSION_INFO::ProductName - 
	static char * const Description() { return "Support for MxPlugin components"; }		//same as VS_VERSION_INFO::FileDescription  
	static char * const SupportSite() { return "http://mxplugin.codeplex.com/"; }		//
    static char * const LicenceWebPage() { return "http://mxplugin.codeplex.com/license"; }	
	static const   GUID SID() { return SID_Universal; }									//SocketID - see Socket Id section above 
	static char * const Owner() { return "Maximodex"; }									//used for creating registry key
};

static const GUID PRODID_PluginICPsampleApp = { 0xc03ddbd8, 0x6345, 0x4dcc, { 0x94, 0xef, 0xf8, 0x70, 0x73, 0x2b, 0x3c, 0x5c } };	// Error range 1850-1899 // {C03DDBD8-6345-4DCC-94EF-F870732B3C5C}	depends: PRODID_MxUtils
class ProdIdPluginICPsampleApp
{
public:
	static const   GUID ProdID() { return PRODID_PluginICPsampleApp; }					//Same as MxProductID::ConvertToGUID(VS_VERSION_INFO::InternalName) 
	static char * const Name() { return "PluginICPsampleApp"; }							//same as VS_VERSION_INFO::ProductName - 
	static char * const Description() { return "exercises PluginICPsample"; }			//same as VS_VERSION_INFO::FileDescription  
	static char * const SupportSite() { return "http://ospacs.codeplex.com/"; }	
    static char * const LicenceWebPage() { return "http://ospacs.codeplex.com/license"; }		//
	static const   GUID SID() { return SID_Universal; }									//SocketID - see Socket Id section above 
	static char * const Owner() { return "Maximodex"; }									//used for creating registry key
};

static const GUID PRODID_PluginXmlApp =	      { 0xc3f1d8cc, 0x9965, 0x4589, { 0x88, 0x1a, 0xeb, 0x56, 0x1d, 0x74, 0x85, 0x30 } };	// Error range 6300-6399 {C3F1D8CC-9965-4589-881A-EB561D748530} depends: PRODID_MxUtils, PRODID_MxPluginManager
class ProdIdPluginXmlApp
{
public:
	static const   GUID ProdID() { return PRODID_PluginXmlApp; }						//Same as MxProductID::ConvertToGUID(VS_VERSION_INFO::InternalName) 
	static char * const Name() { return "PluginXmlApp"; }								//same as VS_VERSION_INFO::ProductName - 
	static char * const Description() { return "Wrapped for SimpleXml"; }				//same as VS_VERSION_INFO::FileDescription  
	static char * const SupportSite() { return "http://mxplugin.codeplex.com/"; }		//
    static char * const LicenceWebPage() { return "http://mxplugin.codeplex.com/license"; }	
	static const   GUID SID() { return SID_Universal; }									//SocketID - see Socket Id section above 
	static char * const Owner() { return "Maximodex"; }									//used for creating registry key
};

static const GUID PRODID_URAImageExportGUI =	{ 0xd73bfb22, 0xd006, 0x47aa, { 0x8d, 0xab, 0x47, 0xd1, 0x2b, 0xf2, 0x8a, 0x52 } };	// Error range 7000-7300 {D73BFB22-D006-47AA-8DAB-47D12BF28A52}	depends: PRODID_MxUtils, PRODID_MxPluginManager, PRODID_PluginXml 
class ProdIdURAImageExportGUI
{
public:
	static const   GUID ProdID() { return PRODID_URAImageExportGUI; }					//Same as MxProductID::ConvertToGUID(VS_VERSION_INFO::InternalName) 
	static char * const Name() { return "URAImageExportGUI"; }							//same as VS_VERSION_INFO::ProductName - 
	static char * const Description() { return "Exports images from URA"; }				//same as VS_VERSION_INFO::FileDescription  
	static char * const SupportSite() { return "http://www.ocuds.com/"; }			//
    static char * const LicenceWebPage() { return "http://ospacs.codeplex.com/license"; }	
	static const   GUID SID() { return SID_Universal; }									//SocketID - see Socket Id section above 
	static char * const Owner() { return "Maximodex"; }									//used for creating registry key
};

static const GUID PRODID_ImageCuratorGUI =		{ 0xa0bac13, 0x74a4, 0x42ce, { 0xbd, 0x9c, 0xdb, 0x85, 0x28, 0x24, 0x7c, 0x63 } };	// Error range 8000-8500 {0A0BAC13-74A4-42CE-BD9C-DB8528247C63}	depends: PRODID_MxUtils, PRODID_MxPluginManager, PRODID_PluginXml, PRODID_PluginIC*
class ProdIdImageCuratorGUI
{
public:
	static const   GUID ProdID() { return PRODID_ImageCuratorGUI; }					//Same as MxProductID::ConvertToGUID(VS_VERSION_INFO::InternalName) 
	static char * const Name() { return "ImageCurator"; }							//same as VS_VERSION_INFO::ProductName - 
	static char * const Description() { return "Tool for the annotation, classification and processing of an image dataset"; }				//same as VS_VERSION_INFO::FileDescription  
	static char * const SupportSite() { return "http://www.imagecurator.com/"; }		//
	static char * const LicenceWebPage() { return "http://imagecurator.codeplex.com/license"; }		//
	static const   GUID SID() { return SID_ImageCurator; }								//SocketID - see Socket Id section above 
	static char * const Owner() { return "Maximodex"; }									//used for creating registry key
};


